package com.cjm.algorithm.leetcode;

public class MoveZero283 {
    public static void main(String[] args) {
        int[] ints = moveZeroes1(new int[]{0, 1, 0, 3, 12});
        System.err.println("ok");
    }

    /**
     * 这种解法, 使用了额外的空间, 没有对原数组进行修改,
     * @param nums
     * @return
     */
    private static int[] moveZeroes3(int[] nums) {
        int[] temp = new int[nums.length];
        int k = 0;
        for (int i = 0;i<nums.length;i++) {
            if (nums[i] != 0) {
                temp[k] = nums[i];
                k++;
            }
        }
        for (int i = k;i<nums.length;i++) {
            temp[i] = 0;
        }
        return temp;
    }

    /**
     * √
     * @param nums
     * @return
     */
    private static int[] moveZeroes2(int[] nums) {
        int k = 0;
        for (int i = 0; i < nums.length; i++) {
            int temp = nums[i];
            if (temp != 0) {
                swap(nums, k, i);
                k++;
            }
        }
        for(int j = k;j < nums.length;j++) {
            nums[j] = 0;
        }
        return nums;
    }

    /**
     * 这个做法的话, 是因为那些个数字的相对位置 改变了, 也是不符合题意的
     *
     * @param nums
     * @return
     */
    private static int[] moveZeroes1(int[] nums) {
        int star = 0;
        int end = nums.length - 1;
        if (star == end) {
            return nums;
        }
        while (star <= end) {
            if (nums[star] == 0) {
                swap(nums, star, end);
                end --;
            }
            if (nums[star] != 0) {
                star ++;
            }
        }
        return nums;
    }

    private static void swap(int[] nums, int star, int end) {
        int temp = nums[star];
        nums[star] = nums[end];
        nums[end] = temp;
    }
}
